# include <iostream> 
# include <functional> 
# include <vector> 
# include <algorithm> 
using namespace std;
void printVec(vector<int> nums)
{
	for (int i = 0; i < nums.size(); ++i)
		cout << nums[i] << " ";
	cout << endl;
}
int main(void)
{
	int nums_temp[] = { 8, 3, 4, 8, 9, 2, 3, 4 };
	vector<int> nums(nums_temp, nums_temp + 8);
	cout << "sorce nums: "; printVec(nums);
	cout << "(默认)make_heap: ";
	make_heap(nums.begin(), nums.end()); //默认是大顶堆，只是将最大值的元素和第一个元素互换,其他元素的顺序不变
	printVec(nums);
	cout << "(less)make_heap: ";
	make_heap(nums.begin(), nums.end(), less<int>()); //创建大顶堆，只是将最大值的元素和第一个元素互换,其他元素的顺序不变
	printVec(nums);
	cout << "(greater)make_heap: ";
	make_heap(nums.begin(), nums.end(), greater<int>()); //创建小顶堆，只是将最小值的元素和第一个元素互换,其他元素的顺序不变
	printVec(nums);
	cout << "此时，nums为小顶堆" << endl;
	cout << "push_back(3)" << endl;
	nums.push_back(3); //在vector的末尾添加元素
	cout << "忽略第三个参数，即为默认)push_heap: ";

	//下面的一行代码，相当于是往vector中添加元素后更新heap,执行到此处会出现错误，只有make_heap（）和push_heap（）同为大顶堆或小顶堆,才能更新。 
	//但是此处push_heap使用默认参数，是更新大顶堆，但是上面最后一个make_heap创建的是小顶堆，冲突。
	//push_heap(nums.begin(), nums.end()); 
	printVec(nums);
	cout << "第三个参数为greater: ";
	push_heap(nums.begin(), nums.end(), greater<int>()); //指定参数后不发生冲突
	printVec(nums);
	cout << "(做替换)默认参数pop_heap: ";
	//pop_heap()并没有删除元素，而是将堆顶元素和数组最后一个元素进行了替换。和上面的push_heap一样第三个参数不指定的话，会发生冲突
	//pop_heap(nums.begin(), nums.end()); 
	printVec(nums);
	cout << "(做替换)第三个参数为greater,pop_heap: ";
	pop_heap(nums.begin(), nums.end(), greater<int>()); //指定参数后不发生冲突
	printVec(nums);
	cout << "pop_back(): ";
	nums.pop_back(); //删除vector末尾的元素
	printVec(nums);
}

